package cn.edu.xmu.restfuldemo.dao;

import cn.edu.xmu.restfuldemo.mapper.GoodsSkuPoMapper;
import cn.edu.xmu.restfuldemo.mapper.GoodsSkuPoMapper1;
import cn.edu.xmu.restfuldemo.model.BO.GoodsSku;
import cn.edu.xmu.restfuldemo.model.PO.GoodsSkuPo;
import cn.edu.xmu.restfuldemo.model.VO.GoodsSkuVo;
import cn.edu.xmu.restfuldemo.model.VO.OrderWithItemsSkuRetVo;
import cn.edu.xmu.restfuldemo.util.RedisUtil;
import cn.edu.xmu.restfuldemo.util.ReturnObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Repository;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * @author Zijun Min
 * @description
 * @createTime 2021/10/22 16:52
 **/
@Repository
public class GoodsSkuDao {
    @Autowired
    private GoodsSkuPoMapper goodsSkuPoMapper;

    @Autowired
    private GoodsSkuPoMapper1 goodsSkuPoMapper1;

    @Autowired
    private RedisUtil redisUtil;

    @Value("${restfuldemo.goodsSku.expiretime}")
    private long goodsTimeout;

    /**
     * 不加redis的嵌套查询
     * @param id
     * @return
     */
    public ReturnObject<GoodsSku> findGoodsSkuByOrderId(Long id){
        GoodsSkuPo goodsSkuPo= goodsSkuPoMapper.selectByPrimaryKey(id);
        GoodsSkuVo goodsSkuVo=new GoodsSkuVo(goodsSkuPo);
        return new ReturnObject<>(goodsSkuVo.newGoodsSku());
    }


    /**
     * 加redis的嵌套查询
     * @param id
     * @return
     */
    public ReturnObject<GoodsSku> findGoodsSkuByOrderIdUsingRedis(Long id){
        List<GoodsSku> retGoodsSku = null;
        String key = "sku_"+id;
        GoodsSku goodsSku = (GoodsSku) redisUtil.get(key);
        if (null != goodsSku){
            return new ReturnObject<>(goodsSku);
        }
        GoodsSkuPo goodsSkuPo= goodsSkuPoMapper.selectByPrimaryKey(id);
        GoodsSkuVo goodsSkuVo=new GoodsSkuVo(goodsSkuPo);
        redisUtil.set(key, (Serializable) goodsSkuVo.newGoodsSku(), goodsTimeout);
        return new ReturnObject<>(goodsSkuVo.newGoodsSku());
    }

    /**
     * 不加redis的连接查询
     * @param orderId
     * @return
     */
    public ReturnObject<OrderWithItemsSkuRetVo> findGoodsSkuByOrderIdSql(Long orderId){
        OrderWithItemsSkuRetVo orderWithItemsSkuRetVo=goodsSkuPoMapper1.selectByOrderId(orderId);
        return new ReturnObject<>(orderWithItemsSkuRetVo);
    }

    /**
     * 加redis的嵌套查询
     * @param orderId
     * @return
     */
    public ReturnObject<OrderWithItemsSkuRetVo> findGoodsSkuByOrderIdSqlUsingRedis(Long orderId){
        List<GoodsSku> retGoodsSku = null;
        String key = "order_"+ orderId;
        OrderWithItemsSkuRetVo orderWithItemsSkuRetVo1 = (OrderWithItemsSkuRetVo) redisUtil.get(key);
        if (null != orderWithItemsSkuRetVo1){
            return new ReturnObject<>(orderWithItemsSkuRetVo1);
        }
        OrderWithItemsSkuRetVo orderWithItemsSkuRetVo=goodsSkuPoMapper1.selectByOrderId(orderId);
        redisUtil.set(key, (Serializable) orderWithItemsSkuRetVo, goodsTimeout);
        return new ReturnObject<>(orderWithItemsSkuRetVo);
    }



}
